#pragma once

namespace Commands
{
    namespace Core
    {
        class Dispatcher;
        template<typename> class Command;
    }

    /** \brief */
    class IDispatchable
    {
    public:
        /** \brief */
        virtual ~IDispatchable(){}

        /** \brief */
        virtual void Live(const float seconds) = 0;

        /** \brief */
        virtual void AddCommand(const int queueId, const Core::Command<Core::Dispatcher>& command) = 0;

        /** \brief */
        virtual bool CommandsEnded(void) const = 0;

        /** \brief */
        virtual bool CommandsEnded(const int queueId) = 0;

        /** \brief */
        virtual void Clear(const int queueId) = 0;

        /** \brief */
        virtual void Clear(void) = 0;

        /** \brief */
        virtual float GetData(const int dataId) = 0;

        /** \brief */
        virtual float GetData(const int queueId, const int dataId) = 0;
    };
}//Commands
